<?php
class Prestaciones_extras extends MY_Controller {

	// Datos para pasar a las vistas
	var $pageTitle = 'Prevet :: Parámetros :: Extra';
	var $nombre_entidad = 'Extra';		// Cadena utilizada para los títulos de las páginas

	// Vistas manejadas por el controlador
	var $CARPETA_VISTAS = 'parametros/'; 	// Directorio donde están contenidas las vistas gestionadas por el controlador
	var $pagina_editar; 					// Nombre de la vista de edición

	public function __construct()
    {
    	parent::__construct();

    	$this->pagina_editar = $this->CARPETA_VISTAS . 'prestacion_extra_edit_view';
	}
	
	public function nuevo($id_hist_plan)
	{
		$dataView['title'] = 'Agregar Prestación ' . $this->nombre_entidad;
		$dataView['id_elemento'] = NULL; 	// IMPORTANTE: debe ser nulo para uno nuevo

		$dataView['id_hist_plan'] = $id_hist_plan;

		// Creo un objeto del modelo, para poder buscar todos los datos en la BD
		$obj_prestacion = new Prestacion();
		$dataView['listado_prestaciones'] = $obj_prestacion->get_iterated();

		// La prestación puede ser válida dentro del lapso de vigencia del plan actual.
		// Muestro como opciones de período de inicio, aquellos períodos aún vigentes de plan, no cobrados
		$periodo_actual = date("m") . date("Y");

		$objCuota = new Cuota();
		$objCuota->select('periodo');
		$objCuota->where('historial_plan_id', $id_hist_plan);
		$objCuota->where('fecha_cobro', NULL);
		$objCuota->where('periodo >=', $periodo_actual);
		$dataView['listado_periodos'] = $objCuota->get_iterated();

		$this->_cargarFormEdicion($dataView);
	}

	public function editar($id_elemento)
	{
		$dataView['title'] = 'Editar ' . $this->nombre_entidad;
		$dataView['id_elemento'] = $id_elemento;

		$this->_cargarFormEdicion($dataView);
	}

	private function _cargarFormEdicion($dataView, $cargaCompleta = FALSE)
	{
		if(!isset($dataView['obj'.$this->nombre_entidad]))
		{
			$id_elemento = $dataView['id_elemento'];

			// Creo un objeto del modelo, para poblarlo con los datos que necesito mostrar
			$obj_cobertura_extra = new Prestacion_extra($id_elemento);
			$dataView['obj'.$this->nombre_entidad] = $obj_cobertura_extra;
		}

		if($cargaCompleta) $dataView['modalDesactivado'] = TRUE;

		parent::_loadViews($this->pagina_editar, $dataView, $cargaCompleta);
	}

	public function guardar()
	{
		$dataView['title'] = 'Guardar ' . $this->nombre_entidad;
		$dataView['error'] = '';

		// Defino el objeto que se desea asociar
		$id_prestacion = is_numeric($this->input->post('txt_prestacion')) ? $this->input->post('txt_prestacion') : NULL;
		$id_hist_plan = is_numeric($this->input->post('txt_hist_plan')) ? $this->input->post('txt_hist_plan') : NULL;
		
		$error_guardar = $this->_guardarPermitido($id_hist_plan);
		if($error_guardar == '')
		{
			// Se obtienen los datos del formulario para poblar el modelo
			$obj_cobertura_extra = $this->_obtenerObjetoPrestacion();

			$obj_hist_plan = new Historial_plan($id_hist_plan);
			$obj_prestacion = new Prestacion($id_prestacion);

			// Se manejan transacciones para interactuar con la BD
			$obj_cobertura_extra->trans_begin();
			$operacion_exitosa = $obj_cobertura_extra->save(array($obj_hist_plan, $obj_prestacion));
			if(!$operacion_exitosa && !$obj_cobertura_extra->valid) // Falló la validación de datos
			{
				// Vuelvo a cargar el formulario de edición y mostrar los errores de validación
				$dataView['obj'.$this->nombre_entidad] = $obj_cobertura_extra;
				$dataView['error'] = $obj_cobertura_extra->error->string;
				$dataView['id_hist_plan'] = $id_hist_plan;
				$this->_cargarFormEdicion($dataView, TRUE);
			}
			else
			{
				if ($obj_cobertura_extra->trans_status() === FALSE) // Se chequea el estado de la transacción
				{
				    $obj_cobertura_extra->trans_rollback(); // Si la transacción falló, hago un rollback
				}
				else
				{
				    $obj_cobertura_extra->trans_commit(); // Transacción exitosa, realizo el commit

				    // Cuando la prestación fue correctamente guardada, actualizo el valor de las cuotas del plan
				    $this->_actualizarImporteCuotas($obj_cobertura_extra);
				}

			    $dataView['error'] = $obj_cobertura_extra->error->string; // Almaceno todos los errores que hubieran podido ocurrir
				
				redirect('historiales_planes/ver/' . $obj_cobertura_extra->historial_plan_id);
			}
		}
		else
		{
			// Vuelvo a cargar el formulario de edición y mostrar los errores de validación
			$dataView['error'] = $error_guardar;
			$dataView['path_volver'] = 'historiales_planes/ver/' . $id_hist_plan;
			parent::_loadViews($this->template->getErrorMessageView(), $dataView);
		}
	}

	private function _guardarPermitido($id_hist_plan)
	{
		// Debo validar que el usuario esté activo y que el plan esté vigente
		$obj_hist_plan = new Historial_plan($id_hist_plan);
		$obj_hist_plan->afiliado->get();

		if($obj_hist_plan->afiliado->de_baja) {
			return "No pueden registrarse prestaciones extras para el afiliado ya que se encuentra INACTIVO.";
		}
		else { // Si no está dado de baja, controlo la vigencia del plan actual
			$hist_plan_actual = $this->util_historial_plan->getIdHistorialPlanActual($obj_hist_plan->afiliado_id);
			if($hist_plan_actual != $id_hist_plan) return 'No pueden registrarse prestaciones extras para planes no vigentes.';
			else return '';
		}
	}

	private function _obtenerObjetoPrestacion()
	{
		$id_prestacion = is_numeric($this->input->post('txt_prestacion')) ? $this->input->post('txt_prestacion') : NULL;
		$id_hist_plan = is_numeric($this->input->post('txt_hist_plan')) ? $this->input->post('txt_hist_plan') : NULL;

		// Se obtienen los datos del formulario para poblar el modelo
		$obj_cobertura_extra = new Prestacion_extra();
		$obj_cobertura_extra->where('prestacion_id', $id_prestacion);
		$obj_cobertura_extra->where('historial_plan_id', $id_hist_plan);
		$obj_cobertura_extra->get();

		if(is_numeric($obj_cobertura_extra->cantidad)) $obj_cobertura_extra->cantidad += $this->input->post('txt_cantidad');
		else $obj_cobertura_extra->cantidad = $this->input->post('txt_cantidad');
		
		$obj_cobertura_extra->distribucion_uniforme = $this->input->post('txt_dist_uniforme');
		$obj_cobertura_extra->ilimitadas = $this->input->post('txt_ilimitadas');
		$obj_cobertura_extra->importe_mensual = $this->input->post('txt_importe');
		$obj_cobertura_extra->periodo_inicio = $this->input->post('txt_periodo_inicio');

		return $obj_cobertura_extra;
	}

	private function _actualizarImporteCuotas($obj_cobertura_extra)
	{
		// Las cuotas pueden sufrir un incremento al costo mensual debido a prestaciones extras
		$obj_cuota = new Cuota();
		$obj_cuota->where('historial_plan_id', $obj_cobertura_extra->historial_plan_id);
		$obj_cuota->where('periodo >=', $obj_cobertura_extra->periodo_inicio);
		$listado_cuotas = $obj_cuota->get();

		$obj_cuota->trans_begin();
		foreach ($listado_cuotas as $cuota) {
			$cuota->importe += $obj_cobertura_extra->importe_mensual;
			$cuota->save();
		}

		if ($obj_cuota->trans_status() === FALSE) // Se chequea el estado de la transacción
		{
		    $obj_cuota->trans_rollback(); // Si la transacción falló, hago un rollback
		}
		else
		{
		    $obj_cuota->trans_commit(); // Transacción exitosa, realizo el commit
		}
	}

	/* IMPORTANTE: este método es llamado desde la función heredada de MY_Controller, "borradoPosible" */
	protected function validarEliminacion($id_elemento)
	{
		// NO IMPLEMENTADO
		return FALSE;
	}
}